import cv2
import numpy as np
from PIL import Image
from PIL import Image, ImageFilter

def poisson_blend(base_img, overlay_img, position):
    """
    高级泊松融合（需要安装opencv）
    :param position: (x,y)坐标
    """
    # 转换图像格式
    base = np.array(base_img.convert('RGB'))
    overlay = np.array(overlay_img.convert('RGB'))
    
    # 创建掩码（覆盖区域为白色）
    mask = 255 * np.ones(overlay.shape, dtype=overlay.dtype)
    
    # 计算中心点
    x, y = position
    center = (x + overlay.shape[1]//2, y + overlay.shape[0]//2)
    
    # 执行泊松融合
    blended = cv2.seamlessClone(
        overlay, base, mask, center, 
        cv2.NORMAL_CLONE  # 可改为MIXED_CLONE或MONOCHROME_TRANSFER
    )
    
    return Image.fromarray(blended)


def feather_blend(base_img, overlay_img, position, feather_radius=20):
    """
    羽化边缘融合算法
    :param base_img: 背景图
    :param overlay_img: 要贴入的图
    :param position: 贴图位置(x,y)
    :param feather_radius: 羽化半径(像素)
    :return: 融合后的图像
    """
    # 创建与overlay_img相同大小的alpha通道
    mask = Image.new('L', overlay_img.size, 255)
    
    # 生成渐变蒙版
    for y in range(overlay_img.height):
        for x in range(overlay_img.width):
            # 计算到边缘的最小距离
            dist = min(
                x, overlay_img.width - x - 1,
                y, overlay_img.height - y - 1
            )
            if dist < feather_radius:
                alpha = int(255 * dist / feather_radius)
                mask.putpixel((x, y), alpha)
    
    # 应用高斯模糊使过渡更平滑
    mask = mask.filter(ImageFilter.GaussianBlur(radius=feather_radius//2))
    
    # 将overlay_img转为RGBA并应用蒙版
    overlay_rgba = overlay_img.convert('RGBA')
    overlay_rgba.putalpha(mask)
    
    # 合成图像
    base_img.paste(overlay_rgba, position, overlay_rgba)
    return base_img